TIP Sample App/InspectorViewController.m (163 lines of code) (raw):

// // InspectorViewController.m // TwitterImagePipeline // // Created on 2/20/17. // Copyright © 2020 Twitter. All rights reserved. // #import <TwitterImagePipeline/TwitterImagePipeline.h> #import "InspectorViewController.h" #import "PipelineInspectorViewController.h" @interface InspectorViewController () <UITableViewDelegate, UITableViewDataSource> { UITableView *_tableView; NSUUID *_inspectionUUID; NSDictionary<NSString *, TIPImagePipelineInspectionResult *> *_results; NSArray<NSString *> *_pipelines; } @end @implementation InspectorViewController - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { self.navigationItem.title = @"Cache Inspector"; } return self; } - (void)dealloc { _tableView.dataSource = nil; _tableView.delegate = nil; } - (void)viewDidLoad { [super viewDidLoad]; _tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleGrouped]; _tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; _tableView.delegate = self; _tableView.dataSource = self; [self.view addSubview:_tableView]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; NSUUID *inspectionUUID = [NSUUID UUID]; _inspectionUUID = inspectionUUID; _results = nil; [_tableView reloadData]; [[TIPGlobalConfiguration sharedInstance] inspect:^(NSDictionary<NSString *, TIPImagePipelineInspectionResult *> *results) { [self _private_completeInspectionWithResults:results UUID:inspectionUUID]; }]; } #pragma mark Table View - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 2; // 1 for the pipelines, 1 for the data usages } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (0 == section) { const NSUInteger count = _results.count; return (count > 0) ? (NSInteger)count : 1; } else { return 3; // disk, memory, rendered } } - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { return (0 == section) ? @"Pipelines" : @"Cache usage"; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if (0 == indexPath.section) { if (!_results) { return [self _private_plainTextCellForTableView:tableView text:@"Loading..."]; } else if (_results.count == 0) { return [self _private_plainTextCellForTableView:tableView text:@"No Pipelines"]; } else { return [self _private_pipelineCellForTableView:tableView atIndex:(NSUInteger)indexPath.row]; } } else { return [self _private_cacheCellForTableView:tableView atIndex:(NSUInteger)indexPath.row]; } } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; if (0 == indexPath.section) { if (_results.count > 0) { [self _private_didSelectPipelineAtIndex:(NSUInteger)indexPath.row]; } } else { [self _private_didSelectCacheTypeAtIndex:(NSUInteger)indexPath.row]; } } #pragma mark Private - (UITableViewCell *)_private_plainTextCellForTableView:(UITableView *)tableView text:(NSString *)text { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TextCell"]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"TextCell"]; } cell.textLabel.text = text; return cell; } - (UITableViewCell *)_private_chevronTextCellForTableView:(UITableView *)tableView text:(NSString *)text { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ChevronCell"]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"ChevronCell"]; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; } cell.textLabel.text = text; return cell; } - (UITableViewCell *)_private_pipelineCellForTableView:(UITableView *)tableView atIndex:(NSUInteger)index { return [self _private_chevronTextCellForTableView:tableView text:_pipelines[index]]; } - (UITableViewCell *)_private_cacheCellForTableView:(UITableView *)tableView atIndex:(NSUInteger)index { NSString *text = nil; if (0 == index) { text = [NSString stringWithFormat:@"Rendered Cache: %@ / %@", [NSByteCountFormatter stringFromByteCount:[TIPGlobalConfiguration sharedInstance].totalBytesForAllRenderedCaches countStyle:NSByteCountFormatterCountStyleBinary], [NSByteCountFormatter stringFromByteCount:[TIPGlobalConfiguration sharedInstance].maxBytesForAllRenderedCaches countStyle:NSByteCountFormatterCountStyleBinary]]; } else if (1 == index) { text = [NSString stringWithFormat:@"Memory Cache: %@ / %@", [NSByteCountFormatter stringFromByteCount:[TIPGlobalConfiguration sharedInstance].totalBytesForAllMemoryCaches countStyle:NSByteCountFormatterCountStyleBinary], [NSByteCountFormatter stringFromByteCount:[TIPGlobalConfiguration sharedInstance].maxBytesForAllMemoryCaches countStyle:NSByteCountFormatterCountStyleBinary]]; } else { text = [NSString stringWithFormat:@"Disk Cache: %@ / %@", [NSByteCountFormatter stringFromByteCount:[TIPGlobalConfiguration sharedInstance].totalBytesForAllDiskCaches countStyle:NSByteCountFormatterCountStyleBinary], [NSByteCountFormatter stringFromByteCount:[TIPGlobalConfiguration sharedInstance].maxBytesForAllDiskCaches countStyle:NSByteCountFormatterCountStyleBinary]]; } return [self _private_chevronTextCellForTableView:tableView text:text]; } - (void)_private_didSelectCacheTypeAtIndex:(NSUInteger)index { NSString *cacheTypeName = nil; if (0 == index || 1 == index) { cacheTypeName = @"rendered & memory"; } else { cacheTypeName = @"disk"; } UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:[NSString stringWithFormat:@"Clear %@ caches?", cacheTypeName] message:[NSString stringWithFormat:@"Would you like to remove all cached entries from all %@ caches?", cacheTypeName] preferredStyle:UIAlertControllerStyleActionSheet]; [alertVC addAction:[UIAlertAction actionWithTitle:@"Clear them!" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) { if (0 == index || 1 == index) { [[TIPGlobalConfiguration sharedInstance] clearAllMemoryCaches]; } else { [[TIPGlobalConfiguration sharedInstance] clearAllDiskCaches]; } }]]; [alertVC addAction:[UIAlertAction actionWithTitle:@"Nevermind" style:UIAlertActionStyleCancel handler:NULL]]; [self presentViewController:alertVC animated:YES completion:NULL]; } - (void)_private_didSelectPipelineAtIndex:(NSUInteger)index { TIPImagePipelineInspectionResult *result = _results[_pipelines[index]]; if (!result) { return; } PipelineInspectorViewController *vc = [[PipelineInspectorViewController alloc] initWithPipelineInspectionResult:result]; [self.navigationController pushViewController:vc animated:YES]; } - (void)_private_completeInspectionWithResults:(NSDictionary<NSString *, TIPImagePipelineInspectionResult *> *)results UUID:(NSUUID *)UUID { if ([_inspectionUUID isEqual:UUID]) { _inspectionUUID = nil; _results = results; _pipelines = [results keysSortedByValueUsingSelector:@selector(compare:)]; [_tableView reloadData]; } } @end